package com.item.mq.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TopicRabbitConfig {

    /**
     * 绑定键
     */
    public final static String T_QUEUE_A = "topic.a";
    public final static String T_QUEUE_B = "topic.b";
    @Bean
    public Queue topicQueueA() {
        // durable:是否持久化,默认是false,持久化队列：会被存储在磁盘上，当消息代理重启时仍然存在，暂存队列：当前连接有效
        // exclusive:默认也是false，只能被当前创建的连接使用，而且当连接关闭后队列即被删除。此参考优先级高于durable
        // autoDelete:是否自动删除，当没有生产者或者消费者使用此队列，该队列会自动删除。
        //   return new Queue("TestDirectQueue",true,true,false);
        return new Queue(TopicRabbitConfig.T_QUEUE_A);
    }

    @Bean
    public Queue topicQueueB() {
        return new Queue(TopicRabbitConfig.T_QUEUE_B);
    }

    /**
     * Direct交换机 起名：topicExchange
     * @return
     */
    @Bean
    TopicExchange exchangeA() {
        return new TopicExchange("topicExchangeA");
    }

    @Bean
    TopicExchange exchangeB() {
        return new TopicExchange("topicExchangeB");
    }

    /**
     *将topicQueueA和topicExchange绑定,而且绑定的键值为topic.a
     *这样只要是消息携带的路由键是topic.a,才会分发到该队列
     * @return
     */
    @Bean
    Binding bindingExchangeMessage() {
        return BindingBuilder.bind(topicQueueA()).to(exchangeA()).with(T_QUEUE_A);
    }

    /**
     * 将topicQueueB和topicExchange绑定,而且绑定的键值为用上通配路由键规则topic.#
     * 这样只要是消息携带的路由键是以topic.开头,都会分发到该队列
     * 这个交换机连接了两个队列，以topic.开头的所有队列
     * topic类型的可以使用   # 和 * ，*代表一个字符
     * @return
     */
    @Bean
    Binding bindingExchangeMessage2() {
        return BindingBuilder.bind(topicQueueB()).to(exchangeB()).with("topic.#");
    }

}
